/*
 * @Author: dengyl
 * @Date: 2022-01-19 14:48:02
 * @LastEditTime: 2022-01-19 15:38:37
 * @LastEditors: Please set LastEditors
 * @Description: 事件机制
 * @FilePath: \ctp-static-portal-front\src\utils\emitter.js
 */
class EventEmitter {
    subs = {
        any: [],
        // resize: []  // 窗口变化
    };

    /**
     * @description: 添加订阅
     * @param {string}name 订阅频道
     * @param {function}fn 执行方法
     */
    subscribe(name="any", fn) {
        if (!this.subs[name]) {
            this.subs[name] = [];
        }
        this.subs[name].push(fn);   // 保存订阅的方法
    }
    /**
     * @description: 退订
     * @param {string}channel 退订频道
     * @param {function}fn 订阅添加的执行方法
     */
    unsubscribe(name="any", fn) {
        if(!fn) {
            // 没指定方法，就删除所有
            delete this.subs[name];
        } else {
            // 将退订的方法从数组中移除
            this.subs[name] = this.subs[name].filter((item) => item !== fn);
        }
    }
    /**
     * @description: 发布
     * @param {string}name 订阅频道
     * @param {any}args 各种参数
     */
    publish(name="any", ...args) {
        this.subs[name] && this.subs[name].forEach(fn => fn(...args));     // 根据不同的类型调用相应的方法
    }

    /**
     * @description: 获取所有的订阅
     */
    getAll() {
        return this.subs;
    }
}

export default new EventEmitter();